#2.两数相加（不会）

'''
def addTwoNumbers(l1, l2):
    carry = 0  # 初始化进位为 0
    result = []
    i, j = 0, 0

    # 同时遍历两个列表
    while i < len(l1) or j < len(l2) or carry:
        # 获取当前位的值，如果列表已遍历完则取 0
        num1 = l1[i] if i < len(l1) else 0
        num2 = l2[j] if j < len(l2) else 0

        # 计算当前位的和以及进位
        total = num1 + num2 + carry
        digit = total % 10  # 当前位的值
        carry = total // 10  # 进位

        # 将当前位的值添加到结果列表中
        result.append(digit)

        # 移动指针
        i += work_1
        j += work_1

    return result

# 测试代码
l1 = [2, 4, 3]
l2 = [5, 6, 4]
print(addTwoNumbers(l1, l2))  # 输出: [7, 0, 8]

'''


class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1 is None:
            return l2
        if l2 is None:
            return l1

        # 定义进位项，定义结果
        remainder = 0
        result = cur = ListNode()

        while l1 or l2:
            # 判断链表是否被实例化
            x = l1.val if l1 else 0
            y = l2.val if l2 else 0
            # 计算
            total = x + y + remainder
            cur.next = ListNode(total % 10)  # 将链表链接起来
            remainder = total // 10  # 保存进位用于下一次计算，因为是从低位开始保存，所以next保存余数，remainder保存进位

            # 更新l1, l2，cur的当前节点到下一个
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
            cur = cur.next

        # 计算完毕后如果还有进位，将进位保存到下一个
        if remainder:
            cur.next = ListNode(remainder)

        return result.next  # 从保存的第一项开始返回节点，因为cur已经被更新到了最后位，但是result的next还在起始位
